﻿#ifndef AVPLAYER_H
#define AVPLAYER_H
#include <QString>
#include <thread>
#include "AVCommon.h"
class AVDumer;
struct AVContext;
class AVPlayer
{
public:
    AVPlayer();
    ~AVPlayer();
    bool Open(const QString& path);//打开媒体文件
    bool Puase(const bool pause);//暂停av
    bool Volum(const qreal& v);//调节音量
    inline bool IsPlay(){return playStatus_;}//当前播放状态
    using  ProcessCallBack = std::function<void(double)>;//进度条回调函数，更新进度条
    inline void setProcessCb(const ProcessCallBack& cb){processCb_ = cb;}//设置回调函数
    inline void setVideoFrameCb(const FrameCallBack& cb){videoFrameCb_ = cb;}//设置视频帧回调
private:
    void Close();
    void audioPlay();//音频播放线程
    void videoPlay();//视频播放线程
private:
    bool playStatus_ = false;//视频播放状态
    std::atomic_bool quit_ = false;//线程退出状态
    std::atomic_bool puase_ = false;//暂停标志
    AVContext* avContext_ = nullptr;//AV上下文
    std::unique_ptr<AVDumer> AVdumer_;  //解封装对象
    std::atomic<double>	audio_clk_ = 0.0;   //音频播放时间
    ProcessCallBack processCb_ =  [](double){};     //进度条回调函数
    FrameCallBack videoFrameCb_ = [](AVFramePtr){};     //视频帧回调函数
    std::unique_ptr<std::thread> audioThread_ = nullptr;    //音频播放线程
    std::unique_ptr<std::thread> videoThread_ = nullptr;    //视频播放线程

};

#endif // AVPLAYER_H
